www.gusucode.com > VC++ Modbus通信两个小例子-源码程序 > VC++ Modbus通信两个小例子-源码程序/code/MODBUS VC/AAADlg.cpp
// AAADlg.cpp : implementation file // Download by http://www.NewXing.com #include "stdafx.h" #include "AAA.h" #include "AAADlg.h" #include "MODBUS_SERVER.h" #ifdef _DEBUG #define new DEBUG_NEW #undef THIS_FILE static char THIS_FILE[] = __FILE__; #endif ///////////////////////////////////////////////////////////////////////////// // CAboutDlg dialog used for App About class CAboutDlg : public CDialog { public: CAboutDlg(); // Dialog Data //{{AFX_DATA(CAboutDlg) enum { IDD = IDD_ABOUTBOX }; //}}AFX_DATA // ClassWizard generated virtual function overrides //{{AFX_VIRTUAL(CAboutDlg) protected: virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV support //}}AFX_VIRTUAL // Implementation protected: //{{AFX_MSG(CAboutDlg) //}}AFX_MSG DECLARE_MESSAGE_MAP() }; CAboutDlg::CAboutDlg() : CDialog(CAboutDlg::IDD) { //{{AFX_DATA_INIT(CAboutDlg) //}}AFX_DATA_INIT } void CAboutDlg::DoDataExchange(CDataExchange* pDX) { CDialog::DoDataExchange(pDX); //{{AFX_DATA_MAP(CAboutDlg) //}}AFX_DATA_MAP } BEGIN_MESSAGE_MAP(CAboutDlg, CDialog) //{{AFX_MSG_MAP(CAboutDlg) // No message handlers //}}AFX_MSG_MAP END_MESSAGE_MAP() ///////////////////////////////////////////////////////////////////////////// // CAAADlg dialog CAAADlg::CAAADlg(CWnd* pParent /*=NULL*/) : CDialog(CAAADlg::IDD, pParent) { //{{AFX_DATA_INIT(CAAADlg) //}}AFX_DATA_INIT // Note that LoadIcon does not require a subsequent DestroyIcon in Win32 m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME); } void CAAADlg::DoDataExchange(CDataExchange* pDX) { CDialog::DoDataExchange(pDX); //{{AFX_DATA_MAP(CAAADlg) DDX_Control(pDX, IDC_E_VALUE, m_value); DDX_Control(pDX, IDC_E_RTU, m_rtu); DDX_Control(pDX, IDC_E_REGCOUNT, m_regcount); DDX_Control(pDX, IDC_E_REGADD, m_regadd); DDX_Control(pDX, IDC_R_TEXT, m_r_text); DDX_Control(pDX, IDC_B_WRITE, m_b_write); DDX_Control(pDX, IDC_B_READ, m_b_read); DDX_Control(pDX, IDC_B_CLOSE, m_b_close); //}}AFX_DATA_MAP } BEGIN_MESSAGE_MAP(CAAADlg, CDialog) //{{AFX_MSG_MAP(CAAADlg) ON_WM_SYSCOMMAND() ON_WM_PAINT() ON_WM_QUERYDRAGICON() ON_BN_CLICKED(IDC_B_CLOSE, OnBClose) ON_BN_CLICKED(IDC_B_READ, OnBRead) ON_BN_CLICKED(IDC_B_WRITE, OnBWrite) ON_WM_CLOSE() //}}AFX_MSG_MAP END_MESSAGE_MAP() ///////////////////////////////////////////////////////////////////////////// // CAAADlg message handlers BOOL CAAADlg::OnInitDialog() { CDialog::OnInitDialog(); // Add "About..." menu item to system menu. // IDM_ABOUTBOX must be in the system command range. ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX); ASSERT(IDM_ABOUTBOX < 0xF000); CMenu* pSysMenu = GetSystemMenu(FALSE); if (pSysMenu != NULL) { CString strAboutMenu; strAboutMenu.LoadString(IDS_ABOUTBOX); if (!strAboutMenu.IsEmpty()) { pSysMenu->AppendMenu(MF_SEPARATOR); pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu); } } // Set the icon for this dialog. The framework does this automatically // when the application's main window is not a dialog SetIcon(m_hIcon, TRUE); // Set big icon SetIcon(m_hIcon, FALSE); // Set small icon // TODO: Add extra initialization here /* Parity : EVENPARITY Even MARKPARITY Mark NOPARITY No parity ODDPARITY Odd SPACEPARITY Space */ /*BaudRate: CBR_110 CBR_19200 CBR_300 CBR_38400 CBR_600 CBR_56000 CBR_1200 CBR_57600 CBR_2400 CBR_115200 CBR_4800 CBR_128000 CBR_9600 CBR_256000 CBR_14400 */ /* ONESTOPBIT 1 stop bit ONE5STOPBITS 1.5 stop bits TWOSTOPBITS */ MODBUS_S_Init(1,CBR_9600,8,NOPARITY,ONESTOPBIT); return TRUE; // return TRUE unless you set the focus to a control } void CAAADlg::OnSysCommand(UINT nID, LPARAM lParam) { if ((nID & 0xFFF0) == IDM_ABOUTBOX) { CAboutDlg dlgAbout; dlgAbout.DoModal(); } else { CDialog::OnSysCommand(nID, lParam); } } // If you add a minimize button to your dialog, you will need the code below // to draw the icon. For MFC applications using the document/view model, // this is automatically done for you by the framework. void CAAADlg::OnPaint() { if (IsIconic()) { CPaintDC dc(this); // device context for painting SendMessage(WM_ICONERASEBKGND, (WPARAM) dc.GetSafeHdc(), 0); // Center icon in client rectangle int cxIcon = GetSystemMetrics(SM_CXICON); int cyIcon = GetSystemMetrics(SM_CYICON); CRect rect; GetClientRect(&rect); int x = (rect.Width() - cxIcon + 1) / 2; int y = (rect.Height() - cyIcon + 1) / 2; // Draw the icon dc.DrawIcon(x, y, m_hIcon); } else { CDialog::OnPaint(); } } // The system calls this to obtain the cursor to display while the user drags // the minimized window. HCURSOR CAAADlg::OnQueryDragIcon() { return (HCURSOR) m_hIcon; } void CAAADlg::OnBClose() { // TODO: Add your control notification handler code here //退出 CDialog::EndDialog(0); } void CAAADlg::OnBRead() { //发送读指令并接受返回 short int ilist[200]; bool blist[200]; CString rtu,regadd,regcount,strtmp; memset(ilist,0x00,200); memset(blist,0x00,200); m_rtu.GetWindowText(rtu); m_regadd.GetWindowText(regadd); m_regcount.GetWindowText(regcount); if(rtu.IsEmpty()) { MessageBox("PLC地址不能为空","MODBUS测试",MB_OK); return; } else if(regadd.IsEmpty()) { MessageBox("变量地址不能为空","MODBUS测试",MB_OK); return; } else if(regcount.IsEmpty()) { MessageBox("变量数量不能为空","MODBUS测试",MB_OK); return; } //判断是否为数字 unsigned short int i_regadd, i_regcount; unsigned char i_rtu; for(int i=0; i<rtu.GetLength(); i++) { if(isdigit(rtu[0])==0) { MessageBox("PLC地址不能为字符","MODBUS测试",MB_OK); return; } } i_rtu= atoi(rtu); for(i=0; i<regadd.GetLength(); i++) { if(isdigit(regadd[0])==0) { MessageBox("变量地址不能为字符","MODBUS测试",MB_OK); return; } } i_regadd= atoi(regadd); if(i_regadd > 50000 || i_regadd <= 0) { MessageBox("变量地址范围不正确","MODBUS测试",MB_OK); return; } for(i=0; i<regcount.GetLength(); i++) { if(isdigit(regcount[0])==0) { MessageBox("变量数量不能为字符","MODBUS测试",MB_OK); return; } } i_regcount= atoi(regcount); if(i_regcount > 200) { MessageBox("变量数量不能大于200","MODBUS测试",MB_OK); return; } //生成并发送命令 char state= 0; int nlength=m_r_text.GetTextLength(); m_r_text.SetSel(nlength, nlength); m_r_text.ReplaceSel("发送数据\r\n"); if(i_regadd >= 40001 && i_regadd <= 49999) { state= MODBUS_S_ReadMultiRegD(i_rtu,i_regadd,i_regcount,ilist); } else if(i_regadd >= 10001 && i_regadd <= 19999) { state= MODBUS_S_ReadMultiRegM_1x(i_rtu,i_regadd,i_regcount,blist); } else if(i_regadd >= 1 && i_regadd <= 9999) { state= MODBUS_S_ReadMultiRegM(i_rtu,i_regadd,i_regcount,blist); } if(state==-1) { nlength=m_r_text.GetTextLength(); m_r_text.SetSel(nlength, nlength); m_r_text.ReplaceSel("接收数据CRC检验失败\r\n"); } else if(state==-2) { nlength=m_r_text.GetTextLength(); m_r_text.SetSel(nlength, nlength); m_r_text.ReplaceSel("接收数据失败,无应答\r\n"); } else { nlength=m_r_text.GetTextLength(); m_r_text.SetSel(nlength, nlength); m_r_text.ReplaceSel("接收数据成功.\r\n"); } CString str; if(i_regadd >= 40001 && i_regadd <= 49999) { for(i=0; i<i_regcount; i++) { strtmp.Format("%d--%d\r\n", i_regadd+i,ilist[i]); str+= strtmp; } } else { for(i=0; i<i_regcount; i++) { strtmp.Format("%d--%2x\r\n", i_regadd+i,blist[i]); str+= strtmp; } } //Append str To Rich; nlength=m_r_text.GetTextLength(); m_r_text.SetSel(nlength, nlength); m_r_text.ReplaceSel(str); } void CAAADlg::OnBWrite() { //发送写指令并接受返回 CString rtu,regadd,regcount,regvalue; m_rtu.GetWindowText(rtu); m_regadd.GetWindowText(regadd); m_regcount.GetWindowText(regcount); m_value.GetWindowText(regvalue); if(rtu.IsEmpty()) { MessageBox("PLC地址不能为空","MODBUS测试",MB_OK); return; } else if(regadd.IsEmpty()) { MessageBox("变量地址不能为空","MODBUS测试",MB_OK); return; } else if(regvalue.IsEmpty()) { MessageBox("变量值不能为空","MODBUS测试",MB_OK); return; } //判断是否为数字 unsigned short int i_regadd; unsigned char i_rtu; short int i_regvalue; for(int i=0; i<rtu.GetLength(); i++) { if(isdigit(rtu[0])==0) { MessageBox("PLC地址不能为字符","MODBUS测试",MB_OK); return; } } i_rtu= atoi(rtu); for(i=0; i<regvalue.GetLength(); i++) { if(isdigit(regvalue[0])==0) { MessageBox("变量值不能为字符","MODBUS测试",MB_OK); return; } } i_regvalue= atoi(regvalue); for(i=0; i<regadd.GetLength(); i++) { if(isdigit(regadd[0])==0) { MessageBox("变量地址不能为字符","MODBUS测试",MB_OK); return; } } i_regadd= atoi(regadd); if(i_regadd > 50000 || i_regadd <= 0) { MessageBox("变量地址范围不正确","MODBUS测试",MB_OK); return; } //生成并发送命令 char state= 0; int nlength=m_r_text.GetTextLength(); m_r_text.SetSel(nlength, nlength); m_r_text.ReplaceSel("发送数据\r\n"); if(i_regadd >= 40001 && i_regadd <= 49999) { state= MODBUS_S_WriteSingRegD(i_rtu,i_regadd,i_regvalue); } else if(i_regadd >= 1 && i_regadd <= 9999) { if(i_regvalue > 0) { state= MODBUS_S_WriteSingRegM(i_rtu,i_regadd,true); } else { state= MODBUS_S_WriteSingRegM(i_rtu,i_regadd,false); } } if(state > 0) { nlength=m_r_text.GetTextLength(); m_r_text.SetSel(nlength, nlength); m_r_text.ReplaceSel("接收数据成功.\r\n"); } else { nlength=m_r_text.GetTextLength(); m_r_text.SetSel(nlength, nlength); m_r_text.ReplaceSel("接收数据失败\r\n"); } } void CAAADlg::AsciiToHex(CString buff, CString Hex) { //ASCII to Hex Hex= ""; CString str_temp; for(int i=0;i<buff.GetLength();i++) { str_temp.Format("%2x", buff[i]); Hex += str_temp; } } void CAAADlg::ShowCommFrame(LPCTSTR Msg) { //Append str To Rich; int nlength=m_r_text.GetTextLength(); m_r_text.SetSel(nlength, nlength); m_r_text.ReplaceSel(Msg); } void CAAADlg::OnClose() { CDialog::OnClose(); MODBUS_S_UnInit(); }